<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		
	<span class="different-posts different-posts_earlier">📖 <a href="/page/45">earlier posts</a> 📖</span>




	<article>
	
		<h1><a href="/2017/10/12/Apache/24. Apache默认虚拟主机/">Apache默认虚拟主机</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Apache/">Apache</a> <a class="article__tag-link" href="/tags/LAMP/">LAMP</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;为了防止其他不是自己的域名解析到自己的IP,我们可以通过更改虚拟主机文件限制其他域名。我们创建的新的虚拟主机，创建一个新的空目录将其权限设置为600。这样只有我们在配置文件中定义的域名在能访问。<br>命令如下：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># vim /usr/local/apache2/conf/extra/httpd-vhosts.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;把下面的配置：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">&lt;VirtualHost *:80&gt;</div><div class="line">  ServerAdmin webmaster@dummy-host.example.com</div><div class="line">  DocumentRoot <span class="string">"/usr/local/apache2/docs/dummy-host.example.com"</span></div><div class="line">  ServerName dummy-host.example.com</div><div class="line">  ServerAlias www.dummy-host.example.com</div><div class="line">  ErrorLog <span class="string">"logs/dummy-host.example.com-error_log"</span></div><div class="line">  CustomLog <span class="string">"logs/dummy-host.example.com-access_log"</span> common</div><div class="line">&lt;/VirtualHost&gt;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;修改为：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">&lt;VirtualHost *:80&gt;</div><div class="line">  DocumentRoot <span class="string">"/tmp/tmp"</span></div><div class="line">  ServerName tmp.com</div><div class="line"> &lt;Directory /tmp/tmp/&gt;</div><div class="line">  Order allow,deny</div><div class="line">  Deny from all</div><div class="line"> &lt;/Directory&gt; </div><div class="line">&lt;/VirtualHost&gt;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;也可以直接设置成第一个虚拟主机配置文件。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;创建配置中提到的目录，并设置权限 600</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># mkdir /tmp/tmp</span></div><div class="line">[root@lamp ~]<span class="comment"># chmod 600 /tmp/tmp</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;检测配置文件，重启 apache 服务</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># apachectl -t</span></div><div class="line">Syntax OK</div><div class="line">[root@lamp ~]<span class="comment"># apachectl restart</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其实这个默认虚拟主机就是配置文件里的第一个虚拟主机。关于默认虚拟主机有个特点，凡是解析到这台机器的域名，不管是什么域名，只要在配置文件中没有配置，那么都会访问到这个主机上来。为了避免别人乱解析，应该把默认也就是第一个虚拟主机给禁止掉。这里使用了 allow，deny 语句，已经禁止掉了。现在用 ip 或其他域名去访问，已经提示：</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/Apache%E9%BB%98%E8%AE%A4%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/01.png?raw=true" alt=""></figure></p>
<h2 id="apache-nameserver-两个如何设置"><a href="#apache-nameserver-两个如何设置" class="headerlink" title="apache nameserver 两个如何设置"></a>apache nameserver 两个如何设置</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">ServerName sub1.domain.com</div><div class="line">ServerAlias sub2.domain.com</div><div class="line">DocumentRoot /var/www/sub/</div><div class="line"><span class="comment"># other settings</span></div></pre></td></tr></table></figure>
<h2 id="apache-代理模块-proxy应用"><a href="#apache-代理模块-proxy应用" class="headerlink" title="apache 代理模块 proxy应用"></a>apache 代理模块 proxy应用</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要使用proxy功能，首先编译apache的时候，需要加上参数 ·–enable-proxy –enable-proxy-http·</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果，不想重新编译，也可以以扩展的形式安装proxy模块，具体请参考 <a href="https://hcldirgit.github.io/2017/07/27/11.%20apache%20mod_proxy%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%AE%89%E8%A3%85/" target="_blank" rel="external">apache mod_proxy 扩展模块安装</a></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;具体配置为：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">ServerName www.test.com</div><div class="line">CustomLog <span class="string">"/dev/null"</span> combined</div><div class="line">ProxyRequests Off</div><div class="line"></div><div class="line">    Order deny,allow</div><div class="line">    Allow from all</div><div class="line"> </div><div class="line">ProxyPass / http://www.test.com/</div><div class="line">ProxyPassReverse / 192.168.13.111/</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另外需要注意的是，需要在/etc/hosts 中加一条记录  </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">192.168.13.111   www.test.com</div></pre></td></tr></table></figure>
<h2 id="apache某个虚拟主机不启用gzip"><a href="#apache某个虚拟主机不启用gzip" class="headerlink" title="apache某个虚拟主机不启用gzip"></a>apache某个虚拟主机不启用gzip</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认情况下，如果apache中调用了mod_deflate ，那么所有虚拟主机都会启用gzip压缩功能。但有时候会遇到某个虚拟主机不想启用gzip的应用，这如何设置呢？<br>只要在该虚拟主机中加入一下代码即可。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">SetOutputFilter DEFLATE</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里的 /data/web/example 为该虚拟主机的主目录。</p>
<h2 id="apache配置多个域名指向的虚拟主机访问总是指向第一个虚拟主机"><a href="#apache配置多个域名指向的虚拟主机访问总是指向第一个虚拟主机" class="headerlink" title="apache配置多个域名指向的虚拟主机访问总是指向第一个虚拟主机"></a>apache配置多个域名指向的虚拟主机访问总是指向第一个虚拟主机</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在配置apache多个虚拟主机的时候，访问总是指向第一个虚拟主机,加上 NameVirtualHost * :80后解决问题.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">&lt;VirtualHost *:80&gt;</div><div class="line"> DocumentRoot <span class="string">"F:/web"</span> </div><div class="line"> ServerName localhost</div><div class="line">&lt;/VirtualHost&gt;</div><div class="line">&lt;VirtualHost *:80&gt;</div><div class="line"> DocumentRoot <span class="string">"F:/web/aa/"</span> </div><div class="line"> ServerName *.test.com</div><div class="line">&lt;/VirtualHost&gt;</div></pre></td></tr></table></figure>
<h2 id="针对apache的虚拟主机开启php短标签"><a href="#针对apache的虚拟主机开启php短标签" class="headerlink" title="针对apache的虚拟主机开启php短标签"></a>针对apache的虚拟主机开启php短标签</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;php.ini中</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">short_open_tag = On</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;除&lt;?php ?&gt;，可使用更灵活的调用方法</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;? /<em>程序操作</em>/ ?&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;?=/<em>函数</em>/?&gt;</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Apache/23. httpd.conf文件如何配置KeepAlive/">httpd.conf文件如何配置KeepAlive</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Apache/">Apache</a> <a class="article__tag-link" href="/tags/LAMP/">LAMP</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;KeepAlive  意思为是否长连接。 后边可以设置 On 或者 Off</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;简单理解就是这样： 如果设置成On，那么当apache完成用户的请求后，那么apache进程不会断开用户的请求连接，依然保持连接状态。设置成Off则当apache完成用户的请求后，那么apache进程会立即断开和用户的请求连接。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果，完成用户的连接依然连接，这样的好处是：当该用户的请求在过来时，apache会用这个已经建立的连接，不需要重新创建连接。这样会节省CPU的资源。但是却耗费了内存。为什么呢？可以假设这样的场景。假如keepalive 超时时间为10s，而每1s中有100个用户请求访问，每个用户3次连接，每个连接耗费2M内存，那么10s内建立的连接次数为1000次（跟用户每s请求次数无关），消耗内存为1000<em>2=2000M，相反，如果不保持长连接，同样的环境场景下，每1s内有100</em>3个连接，下一秒还是100<em>3个连接，也就是说永远都是100</em>3个连接，那么1s内甚至10s内消耗的内存为100<em>3</em>2=600M。 然而，在这10s内创建的连接次数为100<em>3</em>10=3000次，这样肯定消耗了更多的cpu资源。毕竟每次tcp连接都是需要cpu去处理的。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;问题来了，既然知道长连接与否的利与弊，那么如何判定什么时候On，什么时候Off？</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在上面的举例中，涉及到了一个数，那就是每个用户在1s内请求的次数，你再回去好好看看，如果把3改为1，是不是10s内得到的连接次数总和是一样的。对！那么这样无论是On还是Off，消耗的CPU资源是一样的。所以，我们考虑3种情况：</p>
<ol>
<li>用户浏览一个网页时，除了网页本身外，还引用了多个 javascript 文件，多个 css 文件，多个图片文件，并且这些文件都在同一个 HTTP 服务器上。</li>
<li>用户浏览一个网页时，除了网页本身外，还引用一个 javascript 文件，一个图片文件。</li>
<li>用户浏览的是一个动态网页，由程序即时生成内容，并且不引用其他内容。</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对于上面3中情况，我认为：1 最适合打开 KeepAlive ，2 随意，3 最适合关闭 KeepAlive（连接消耗的内存比较大）</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;总结一下：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在内存非常充足的服务器上，不管是否关闭 KeepAlive 功能，服务器性能不会有明显变化；</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果服务器内存较少，或者服务器有非常大量的文件系统访问时，或者主要处理动态网页服务，关闭 KeepAlive 后可以节省很多内存，而节省出来的内存用于文件系统Cache，可以提高文件系统访问的性能，并且系统会更加稳定。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;目前的服务器，CPU很强，所以不用考虑频繁的tcp连接对cpu造成的压力，那还让它长连接干什么，故，建议关闭你的长连接吧！！！</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PS： 如果，你的服务器上请求量很大，那你最好还是关闭这个参数吧。我试过一次，打开长连接，并且设置超时时间为30s，结果仅仅十几s就把所有的httpd进程跑满。这样很危险的，直接让用户等待，等30s，这不扯淡嘛？即使是你设置成3s，照样会让用户等待3s，这样很不合理的。所以，归根结蒂还是关闭长连接吧，这样效率会更高。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Apache/22. htpasswd 默认创建的密码只有前8位有效/">htpasswd 默认创建的密码只有前8位有效</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Apache/">Apache</a> <a class="article__tag-link" href="/tags/LAMP/">LAMP</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;按照如下命令创建密码</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">htpasswd -c .htpasswd  user1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;假如，密码为123456789</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;那么访问时，不管是输入 12345678 还是 123456789 甚至是 123456781234  都能顺利通过验证。这是为什么呢？</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;htpasswd默认情况，是使用系统库中的crypt()函数来对密码明文进行单向加密的。在网上找到该函数的说明：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;crypt()将使用Data Encryption Standard(DES)演算法将参数key所指的字符串加以编码，key字符串长度仅取前8个字符，超过此长度的字符没有意义。参数salt为两个字 符组成的字符串，由a-z,A-Z,0-9,”.”,和”/“所组成，用来决定使用4096种不同内建表格的哪一个。函数执行成功后会返回指向编码过的字符串指针，参数key所指的字符串不会有所更动。编码过的字符串长度为13个字符，前两个字符为参数salt代表的字符串。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;所以，如果你想创建超过8位的密码，请使用-m参数或者-s 参数，这两个参数分别表示创建的密码以MD5加密方式加密和以SHA方式加密。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">htpasswd -c -m .htpasswd  user1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样创建的密码没有8位数限制了。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Apache/20. apache options参数/">apache options参数</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Apache/">Apache</a> <a class="article__tag-link" href="/tags/LAMP/">LAMP</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;指令控制了在特定目录中将使用哪些服务器特性。Options属性有一个非常特别的功能： 如果你没有用“+”或者“-”来增加或者减少一个功能的时候，每个之前定义的Options的所有功能都会被取消， 直到你又为它指定一些功能。所以options属性在整体设置和虚拟主机设置的是不相关的， 互相不起作用，因为他们在特定的范围内被重载了。  如果要在虚拟主机里面使用在整体设置中的Options的设置， 那么就不要在虚拟主机设置中指定Options属性。如果要增加或者减少功能， 那么用“+”或者“-”符号来实  Options  指令控制了在特定目录中将使用哪些服务器特性。  可选项能设置为  None  ，在这种情况下，将不启用任何额外特性。或设置为以下选项中的一个或多个：  </p>
<ul>
<li>All 除MultiViews之外的所有特性。这是默认设置。 </li>
<li>ExecCGI 允许执行CGI脚本. </li>
<li>FollowSymLinks 服务器会在此目录中使用符号连接。  注意：即便服务器会使用符号连接，但它不会改变用于匹配配置段的路径名。 如果此配置位于配置段中，则此设置会被忽略。</li>
<li>Includes 允许服务器端包含。</li>
<li>IncludesNOEXEC 允许服务器端包含，但禁用#exec命令和#exec CGI。但仍可以从     ScriptAliase目录使用#include 虚拟CGI脚本。 </li>
<li>Indexes 如果一个映射到目录的URL被请求，而此目录中又没有DirectoryIndex（例如：index.html），那么服务器会返回一个格式化后的目录 列表。 </li>
<li>MultiViews 允许内容协商的多重视图。 </li>
<li>SymLinksIfOwnerMatch 服务器仅在符号连接与其目的目录或文件拥有者具有同样的用户id时才使用它。  注意：如果此配置出现在配置段中，此选项将被忽略。  一般来说，如果一个目录被多次设置了  Options  ，则最特殊的一个会被完全接受，而各个可选项的设定彼此并不融合。然而，如果所有施用于  Options  指令的可选项前都加有+或-符号，此可选项将被合并。所有前面加有+号的可选项将强制覆盖当前可选项设置，而所有前面有-号的可选项将强制从当前可选项设置中去除。  </li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;比如说，没有任何+和-符号：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">Options Indexes FollowSymLinks</div><div class="line"> </div><div class="line"> Options Includes</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;则只有  Includes  设置到/web/docs/spec目录上。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然而如果第二个  Options  指令使用了+和-符号：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">Options Indexes FollowSymLinks</div><div class="line">  </div><div class="line"> Options +Includes -Indexes</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;那么就会有  FollowSymLinks  和  Includes  设置到/web/docs/spec目录上。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Apache/21. apache如何在虚拟主机中实现用户验证/">apache如何在虚拟主机中实现用户验证</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Apache/">Apache</a> <a class="article__tag-link" href="/tags/LAMP/">LAMP</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;虚拟主机配置文件中，需要加入</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">AllowOverride AuthConfig</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后在虚拟主机的主目录，即DocumentRoot  目录下</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">vim   /data/web/<span class="built_in">test</span>/.htaccess</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加入</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">AuthName <span class="string">"frank share web"</span> </div><div class="line">AuthType Basic </div><div class="line">AuthUserFile /data/web/<span class="built_in">test</span>/.htpasswd</div><div class="line">require valid-user</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;保存后，然后创建apache的验证用户</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">htpasswd -c /data/web/<span class="built_in">test</span>/.htpasswd  <span class="built_in">test</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>第一次创建用户要用到-c 参数 第2次添加用户，就不用-c参数</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果想修改密码，可以如下</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">htpasswd -m .htpasswd test2</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;重启apache，即可。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;到此，已经配置完成。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>下面介绍另一种方式：</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">vim http.conf</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在相应的虚拟主机配置文件段，加入</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">AllowOverride AuthConfig</div><div class="line">AuthName <span class="string">"自定义的"</span></div><div class="line">AuthType Basic</div><div class="line">AuthUserFile /data/.htpasswd</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里的/data/.htpasswd你可以随便写一个路径或名字，没有限制</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">require valid-user</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;保存后，然后创建apache的验证用户</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">htpasswd -cm /data/.htpasswd  <span class="built_in">test</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;增加第二个用户的时候，就不要加-c了，因为-c是创建的意思，如果加上会把这个文件重写。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Apache/2. Apache 的 httpd.conf 详解/">Apache 的 httpd.conf 详解</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Apache/">Apache</a> <a class="article__tag-link" href="/tags/LAMP/">LAMP</a>
			</span>
		
	</div>

	

	
		<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ServerRoot “/usr/<span class="built_in">local</span>“</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ServerRoot用于指定守护进程httpd的运行目录，httpd在启动之后将自动将进程的当前目录改变为这个目录，因此如果设置文件中指定的文件或目录是相对路径，那么真实路径就位于这个ServerR oot定义的路径之下。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ScoreBoardFile /var/run/httpd.scoreboard</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;httpd使用ScoreBoardFile来维护进程的内部数据，因此通常不需要改变这个参数，除非管理员想在一台计算机上运行几个Apache服务器，这时每个Apache服务器都需要独立的设置文件htt pd.conf，并使用不同的ScoreBoardFile。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#ResourceConfig conf/srm.conf</span></div><div class="line"><span class="comment">#AccessConfig conf/access.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这两个参数ResourceConfig和AccessConfig，就用于和使用srm.conf和access.conf设置文件的老版本Apache兼容。如果没有兼容的需要，可以将对应的设置文件指定为/dev/null，这将表示不存在其他设置文件，而仅使用httpd.conf一个文件来保存所有的设置选项。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">PidFile /var/run/httpd.pid</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PidFile指定的文件将记录httpd守护进程的进程号，由于httpd能自动复制其自身，因此系统中有多个httpd进程，但只有一个进程为最初启动的进程，它为其他进程的父进程，对这个进程发送信号将影响所有的httpd进程。PidFILE定义的文件中就记录httpd父进程的进程号。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Timeout 300</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Timeout定义客户程序和服务器连接的超时间隔，超过这个时间间隔（秒）后服务器将断开与客户机的连接。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">KeepAlive On</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在HTTP 1.0中，一次连接只能作传输一次HTTP请求，而KeepAlive参数用于支持HTTP 1.1版本的一次连接、多次传输功能，这样就可以在一次连接中传递多个HTTP请求。虽然只有较新的浏览器才支持这个功能，但还是打开使用这个选项。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">MaxKeepAliveRequests 100</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MaxKeepAliveRequests为一次连接可以进行的HTTP请求的最大请求次数。将其值设为0将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面，通常达不到这个上限就完成连接了。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">KeepAliveTimeout 15</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;KeepAliveTimeout测试一次连接中的多次请求传输之间的时间，如果服务器已经完成了一次请求，但一直没有接收到客户程序的下一次请求，在间隔超过了这个参数设置的值之后，服务器就断开连接。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ThreadsPerChild 50</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置服务器使用进程的数目。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这是以服务器的响应速度为准的, 数目太大则会变慢 </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">MaxRequestsPerChild 30</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用子进程的方式提供服务的Web服务，常用的方式是一个子进程为一次连接服务，这样造成的问题就是每次连接都需要生成、退出子进程的系统操作，使得这些额外的处理过程占据了计算机的大量处理能力。因此最好的方式是一个子进程可以为多次连接请求服务，这样就不需要这些生成、退出进程的系统消耗，Apache就采用了这样的方式，一次连接结束后，子进程并不退出，而是停留在系统中等待下一次服务请求，这样就极大的提高了性能。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;但由于在处理过程中子进程要不断的申请和释放内存，次数多了就会造成一些内存垃圾，就会影响系统的稳定性，并且影响系统资源的有效利用。因此在一个副本处理过一定次数的请求之后，就可以让这个子进程副本退出，再从原始的htt pd进程中重新复制一个干净的副本，这样就能提高系统的稳定性。这样，每个子进程处理服务请求次数由MaxRe questPerChild定义。 缺省的设置值为30，这个值对于具备高稳定性特点的FreeBSD系统来讲是过于保守的设置，可以设置为1000甚至更高，设置为0支持每个副本进行无限次的服务处理。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;为了安全,设置为零 </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#Listen 3000</span></div><div class="line"><span class="comment">#Listen 12.34.56.78:80</span></div><div class="line"><span class="comment">#BindAddress *</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Listen参数可以指定服务器除了监视标准的80端口之外，还监视其他端口的HTTP请求。由于FreeBSD系统可以同时拥有多个IP地址，因此也可以指定服务器只听取对某个BindAddress&lt; /B&gt;的IP地址的HTTP请求。如果没有配置这一项，则服务器会回应对所有IP的请求。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;即使使用了BindAddress参数，使得服务器只回应对一个IP地址的请求，但是通过使用扩展的Listen参数，仍然可以让HTTP守护进程回应对其他IP地址的请求。此时Listen参数的用法与上面的第二个例子相同。这种比较复杂的用法主要用于设置虚拟主机。此后可以用VirtualHost参数定义对不同IP的虚拟主机，然而这种用法是较早的HTTP 1.0标准中设置虚拟主机的方法，每针对一个虚拟主机就需要一个IP地址，实际上用处并不大。在HTTP 1.1中，增加了对单IP地址多域名的虚拟主机的支持，使得虚拟主机的设置具备更大的意义。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#ExtendedStatus On</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Apache服务器可以通过特殊的HTTP请求，来报告自身的运行状态，打开这个ExtendedStatus 参数可以让服务器报告更全面的运行状态信息</p>
<hr>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ServerAdmin you@your.address</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;配置文件中应该改变的也许只有ServerAdmin， 这一项用于配置WWW服务器的管理员的email地址，这将在HTTP服务出现错误的条件下返回给浏览器，以便让Web使用者和管理员联系，报告错误。习惯上使用服务器上的webmaster作为WWW服务器的管理员，通过邮件服务器的别名机制，将发送到webmaster 的电子邮件发送给真正的Web管理员。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ServerName localhost</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;缺省情况下，并不需要指定这个ServerName参数，服务器将自动通过名字解析过程来获得自己的名字，但如果服务器的名字解析有问题（通常为反向解析不正确），或者没有正式的DNS名字，也可以在这里指定I P地址。当ServerName设置不正确的时候，服务器不能正常启动。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;通常一个Web服务器可以具有多个名字，客户浏览器可以使用所有这些名字或IP地址来访问这台服务器，但在没有定义虚拟主机的情况下，服务器总是以自己的正式名字回应浏览器。ServerName就定义了Web服务器自己承认的正式名字，例如一台服务器名字（在DNS中定义了A类型）为freebsd.exmaple.org.cn，同时为了方便记忆还定义了一个别名（CNAME记录）为www.exmaple.org.cn，那么Apache自动解析得到的名字就为freebsd.example.org.cn，这样不管客户浏览器使用哪个名字发送请求，服务器总是告诉客户程序自己为freebsd.example.org.cn。虽然这一般并不会造成什么问题，但是考虑到某一天服务器可能迁移到其他计算机上，而只想通过更改DNS中的www别名配置就完成迁移任务，所以不想让客户在其书签中使用 freebsd记录下这个服务器的地址，就必须使用ServerName来重新指定服务器的正式名字。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">DocumentRoot “/usr/<span class="built_in">local</span>/www/data“</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DocumentRoot定义这个服务器对外发布的超文本文档存放的路径，客户程序请求的UR L就被映射为这个目录下的网页文件。这个目录下的子目录，以及使用符号连接指出的文件和目录都能被浏览器访问，只是要在URL上使用同样的相对目录名。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意，符号连接虽然逻辑上位于根文档目录之下，但实际上可以位于计算机上的任意目录中，因此可以使客户程序能访问那些根文档目录之外的目录，这在增加了灵活性的同时但减少了安全性。Apache在目录的访问控制中提供了FollowSymLinks选项来打开或关闭支持符号连接的特性。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">&lt;Directory /&gt;</div><div class="line"> Options FollowSymLinks</div><div class="line"> AllowOverride None</div><div class="line">&lt;/Directory&gt;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Apache服务器可以针对目录进行文档的访问控制，然而访问控制可以通过两种方式来实现，一个是在设置文件 httpd.conf（或access.conf）中针对每个目录进行设置，另一个方法是在每个目录下设置访问控制文件，通常访问控制文件名字为.htaccess。虽然使用这两个方式都能用于控制浏览器的访问，然而使用配置文件的方法要求每次改动后重新启动httpd守护进程，比较不灵活，因此主要用于配置服务器系统的整体安全控制策略，而使用每个目录下的.htaccess文件设置具体目录的访问控制更为灵活方便。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">&lt;Directory “H:/web001“&gt;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Directory语句就是用来定义目录的访问限制的，这里可以看出它的标准语法，为一个目录定义访问限制。上例的这个设置是针对系统的根目录进行的，设置了允许符号连接的选项FollowSymLinks ，以及使用AllowOverride None表示不允许这个目录下的访问控制文件来改变这里进行的配置，这也意味着不用查看这个目录下的相应访问控制文件。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;由于Apache对一个目录的访问控制设置是能够被下一级目录继承的，因此对根目录的设置将影响到它的下级目录。注意由于AllowOverride None的设置，使得Apache服务器不需要查看根目录下的访问控制文件，也不需要查看以下各级目录下的访问控制文件，直至httpd.conf（或access.conf ）中为某个目录指定了允许Alloworride，即允许查看访问控制文件。由于Apache对目录访问控制是采用的继承方式，如果从根目录就允许查看访问控制文件，那么Apache就必须一级一级的查看访问控制文件，对系统性能会造成影响。而缺省关闭了根目录的这个特性，就使得Apache从httpd.conf中具体指定的目录向下搜寻，减少了搜寻的级数，增加了系统性能。因此对于系统根目录设置AllowOverride None不但对于系统安全有帮助，也有益于系统性能。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">Options Indexes FollowSymLinks</div><div class="line"> AllowOverride None</div><div class="line"> Order allow,deny</div><div class="line"> Allow from all</div><div class="line">&lt;/Directory&gt;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里定义的是系统对外发布文档的目录的访问设置，设置不同的AllowOverride选项，以定义配置文件中的目录设置和用户目录下的安全控制文件的关系，而Options选项用于定义该目录的特性。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;配置文件和每个目录下的访问控制文件都可以设置访问限制，设置文件是由管理员设置的，而每个目录下的访问控制文件是由目录的属主设置的，因此管理员可以规定目录的属主是否能覆盖系统在设置文件中的设置，这就需要使用 AllowOverride参数进行设置，通常可以设置的值为：</p>
<ul>
<li>AllowOverride的设置 对每个目录访问控制文件作用的影响 </li>
<li>All 缺省值，使访问控制文件可以覆盖系统配置 </li>
<li>None 服务器忽略访问控制文件的设置 </li>
<li>Options 允许访问控制文件中可以使用Options参数定义目录的选项 </li>
<li>FileInfo 允许访问控制文件中可以使用AddType等参数设置 </li>
<li>AuthConfig 允许访问控制文件使用AuthName，AuthType等针对每个用户的认证机制，这使目录属主能用口令和用户名来保护目录 </li>
<li>Limit 允许对访问目录的客户机的IP地址和名字进行限制 </li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;每个目录具备一定属性，可以使用Options来控制这个目录下的一些访问特性设置，以下为常用的特性选项：</p>
<ul>
<li>Options设置 服务器特性设置 </li>
<li>All 所有的目录特性都有效，这是缺省状态 </li>
<li>None 所有的目录特性都无效 </li>
<li>FollowSymLinks 允许使用符号连接，这将使浏览器有可能访问文档根目录（DocumentRoot）之外的文档 </li>
<li>SymLinksIfOwnerMatch 只有符号连接的目的与符号连接本身为同一用户所拥有时，才允许访问，这个设置将增加一些安全性 </li>
<li>ExecCGI 允许这个目录下可以执行CGI程序 </li>
<li>Indexes 允许浏览器可以生成这个目录下所有文件的索引，使得在这个目录下没有index.html（或其他索引文件）时，能向浏览器发送这个目录下的文件列表 </li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;此外，上例中还使用了Order、Allow、Deny等参数，这是Limit语句中用来根据浏览器的域名和 IP地址来控制访问的一种方式。其中Order定义处理Allow和Deny的顺序，而Allow、Deny则针对名字或IP进行访问控制设置，上例使用allow from all，表示允许所有的客户机访问这个目录，而不进行任何限制。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">UserDir public_html (Win32=“My Documents/My Website“)</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当在一台FreeBSD上运行Apache服务器时，这台计算机上的所有用户都可以有自己的网页路径，形如 <a href="http://freebsd.example.org.cn/~user，使用波浪符号加上用户名就可以映射到用户自己的网页目录上。映射目录为用户个人主目录下的一个子目录，其名字就用UseDir这个参数进行定义，缺省为public_html。如果不想为正式的用户提供网页服务，使用DISABLED作UserDir的参数即可。" target="_blank" rel="external">http://freebsd.example.org.cn/~user，使用波浪符号加上用户名就可以映射到用户自己的网页目录上。映射目录为用户个人主目录下的一个子目录，其名字就用UseDir这个参数进行定义，缺省为public_html。如果不想为正式的用户提供网页服务，使用DISABLED作UserDir的参数即可。</a></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment"># AllowOverride FileInfo AuthConfig Limit</span></div><div class="line"><span class="comment"># Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec</span></div><div class="line"><span class="comment"># </span></div><div class="line"><span class="comment"># Order allow,deny</span></div><div class="line"><span class="comment"># Allow from all</span></div><div class="line"><span class="comment"># </span></div><div class="line"><span class="comment"># </span></div><div class="line"><span class="comment"># Order deny,allow</span></div><div class="line"><span class="comment"># Deny from all</span></div><div class="line"><span class="comment"># </span></div><div class="line"><span class="comment">#</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里可以看到Directory的另一个用法，即可以通过简单的模式匹配方法，针对分布在不同目录下的子目录定义访问控制权限。这样设置就需要Apache服务器对每个路径进行额外的处理，因此就会降低服务器的性能，所以缺省情况并没有打开这种访问限制。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里可以看到另外一个语句Limit，Limit语句就是用来针对具体的请求方法来设定访问控制的，其中可以使用GET、POST等各种服务器支持的请求方法做Limit的参数，来设定对不同请求方法的访问限制。一般可以打开对GET、POST、HEAD三种请求方法，而屏蔽其他的请求方法，以增加安全性。Limit语句中，可以使用Order 、Allow、Deny，Allow和Deny中可以使用匹配的方法针对域名和IP进行限制，只是对于域名是从后向前匹配，对于IP地址则从前向后匹配。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">DirectoryIndex index.html</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;很多情况下，URL中并没有指定文档的名字，而只是给出了一个目录名。那么Apache服务器就自动返回这个目录下由DirectoryIndex定义的文件，当然可以指定多个文件名字，系统会这个目录下顺序搜索。当所有由DirectoryIndex指定的文件都不存在时，Apache服务器可以根据系统设置，生成这个目录下的所有文件列表，提供用户选择。此时该目录的访问控制选项中的Indexes选项（Options Indexes ）必须打开，以使得服务器能够生成目录列表，否则Apache将拒绝访问。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">AccessFileName .htaccess</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;AccessFileName定义每个目录下的访问控制文件的文件名，缺省为.htaccess ，可以通过更改这个文件，来改变不同目录的访问控制限制。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">Order allow,deny</div><div class="line">Deny from all</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;除了可以针对目录进行访问控制之外，还可以根据文件来设置访问控制，这就是File语句的任务。使用File 语句，不管文件处于哪个目录，只要名字匹配，就必须接受相应的访问控制。这个语句对于系统安全比较重要，例如上例将屏蔽所有的使用者不能访问.htaccess文件，这样就避免.htaccess中的关键安全信息不至于被客户获取。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">TypesConfig /usr/<span class="built_in">local</span>/etc/apache/mime.types</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TypeConfig用于设置保存有不同的MIME类型数据的文件名，在FreeBSD下缺省设置为/usr/local/etc/apache/mime.types。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">DefaultType text/plain</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果Web服务器不能决定一个文档的缺省类型，这通常表示文档使用了非标准的后缀，那么服务器就使用 DefaultType定义的MIME类型将文档发送给客户浏览器。这里的设置为text/plain，这样设置的问题是，如果服务器不能判断出文档的MIME，那么大部分情况下这个文档为一个二进制文档，但使用 text/plain格式发送回去，浏览器将在内部打开它而不会提示保存。因此建议将这个设置更改为 application/octet-stream，这样浏览器将提示用户进行保存。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">MIMEMagicFile /usr/<span class="built_in">local</span>/etc/apache/magic</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;除了从文件的后缀出发来判断文件的MIME类型之外，Apache还可以进一步分析文件的一些特征，来判断文件的真实MIME类型。这个功能是由mod_mime_magic模块实现的，它需要一个记录各种MIME类型特征的文件，以进行分析判断。上面的设置是一个条件语句，如果载入了这个模块，就必须指定相应的标志文件magic的位置。 </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">HostnameLookups Off</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;通常连接时，服务器仅仅可以得到客户机的IP地址，如果要想获得客户机的主机名，以进行日志记录和提供给 CGI程序使用，就需要使用这个HostnameLookups选项，将其设置为On打开DNS反查功能。但是这将使服务器对每次客户请求都进行DNS查询，增加了系统开销，使得反应变慢，因此缺省设置为使用Off关闭此选项。关闭选项之后，服务器就不会获得客户机的主机名，而只能使用IP地址来记录客户。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">ErrorLog /var/<span class="built_in">log</span>/httpd-error.log</div><div class="line">LogLevel warn</div><div class="line">LogFormat “%h %l %u %t \“%r\“ %&gt;s %b \“%&#123;Referer&#125;i\“ \“%&#123;User-Agent&#125;i\““ combined</div><div class="line">LogFormat “%h %l %u %t \“%r\“ %&gt;s %b“ common</div><div class="line">LogFormat “%&#123;Referer&#125;i -&gt; %U“ referer</div><div class="line">LogFormat “%&#123;User-agent&#125;i“ agent</div><div class="line"><span class="comment">#CustomLog /var/log/httpd-access.log common</span></div><div class="line"><span class="comment">#CustomLog /var/log/httpd-referer.log referer</span></div><div class="line"><span class="comment">#CustomLog /var/log/httpd-agent.log agent</span></div><div class="line">CustomLog /var/<span class="built_in">log</span>/httpd-access.log combined</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里定义了系统日志的形式，对于服务器错误记录， 由ErrorLog、LogLevel 来定义不同的错误日志文件及其记录内容。 </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对于系统的访问日志，缺省使用CustomLog参数定义日志的位置，缺省使用combined 参数指定将所有的访问日志放在一个文件中，然而也可以将不同种类的访问日志放在不同的日志记录文件中，这是通过在 CustomLog中指定不同的记录类型来完成的。common表示普通的对单页面请求访问记录，referer表示每个页面的引用记录，可以看出一个页面中包含的请求数，agent表示对客户机的类型记录，显然可以将现有的combined 定义的设置行注释掉，并使用common、referer和agent作为CustomLog的参数，来为不同种类的日志分别指定日志记录文件。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;显然，LogFormat是用于定义不同类型的日志进行记录时使用的格式， 这里使用了以%开头的宏定义，以记录不同的内容。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果这些参数指定的文件使用的是相对路径，那么就是相对于ServerRoot的路径。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ServerSignature On</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一些情况下，例如当客户请求的网页并不存在时，服务器将产生错误文档，缺省情况下由于打开了 ServerSignature选项，错误文档的最后一行将包含服务器的名字、Apache的版本等信息。有的管理员更倾向于不对外显示这些信息，就可以将这个参数设置为Off，或者设置为Email，最后一行将替换为对ServerAdmin 的Email提示。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">Alias /icons/ “/usr/<span class="built_in">local</span>/www/icons/“</div><div class="line">　　</div><div class="line"> Options Indexes MultiViews</div><div class="line"> AllowOverride None</div><div class="line"> Order allow,deny</div><div class="line"> Allow from all</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Alias参数用于将URL与服务器文件系统中的真实位置进行直接映射，一般的文档将在DocumentRoot 中进行查询，然而使用Alias定义的路径将直接映射到相应目录下，而不再到DocumentRoot 下面进行查询。因此Alias可以用来映射一些公用文件的路径，例如保存了各种常用图标的icons路径。这样使得除了使用符号连接之外，文档根目录（DocumentRoot）外的目录也可以通过使用了Alias映射，提供给浏览器访问。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;定义好映射的路径之后，应该需要使用Directory语句设置访问限制。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">ScriptAlias /cgi-bin/ “/usr/<span class="built_in">local</span>/www/cgi-bin/“</div><div class="line">　　</div><div class="line"> AllowOverride None</div><div class="line"> Options None</div><div class="line"> Order allow,deny</div><div class="line"> Allow from all</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ScriptAlias也是用于URL路径的映射，但与Alias的不同在于，ScriptAlias是用于映射CGI程序的路径，这个路径下的文件都被定义为CGI程序，通过执行它们来获得结果，而非由服务器直接返回其内容。缺省情况下CGI程序使用cgi-bin目录作为虚拟路径。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># Redirect old-URI new-URL</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Redirect参数是用来重写URL的，当浏览器访问服务器上的一个已经不存在的资源的时候，服务器返回给浏览器新的URL，告诉浏览器从该URL中获取资源。这主要用于原来存在于服务器上的文档，改变了位置之后，而又希望能使用老URL能访问到，以保持与以前的URL兼容。 </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div></pre></td><td class="code"><pre><div class="line">IndexOptions FancyIndexing</div><div class="line">AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip</div><div class="line">AddIconByType (TXT,/icons/text.gif) text/*</div><div class="line">AddIconByType (IMG,/icons/image2.gif) image/*</div><div class="line">AddIconByType (SND,/icons/sound2.gif) audio/*</div><div class="line">AddIconByType (VID,/icons/movie.gif) video/*</div><div class="line">AddIcon /icons/binary.gif .bin .exe</div><div class="line">AddIcon /icons/binhex.gif .hqx</div><div class="line">AddIcon /icons/tar.gif .tar</div><div class="line">AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv</div><div class="line">AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip</div><div class="line">AddIcon /icons/a.gif .ps .ai .eps</div><div class="line">AddIcon /icons/layout.gif .html .shtml .htm .pdf</div><div class="line">AddIcon /icons/text.gif .txt</div><div class="line">AddIcon /icons/c.gif .c</div><div class="line">AddIcon /icons/p.gif .pl .py</div><div class="line">AddIcon /icons/f.gif .<span class="keyword">for</span></div><div class="line">AddIcon /icons/dvi.gif .dvi</div><div class="line">AddIcon /icons/uuencoded.gif .uu</div><div class="line">AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl</div><div class="line">AddIcon /icons/tex.gif .tex</div><div class="line">AddIcon /icons/bomb.gif core</div><div class="line">AddIcon /icons/back.gif ..</div><div class="line">AddIcon /icons/hand.right.gif README</div><div class="line">AddIcon /icons/folder.gif ^^DIRECTORY^^</div><div class="line">AddIcon /icons/blank.gif ^^BLANKICON^^</div><div class="line">DefaultIcon /icons/unknown.gif</div><div class="line"><span class="comment">#AddDescription “GZIP compressed document“ .gz</span></div><div class="line"><span class="comment">#AddDescription “tar archive“ .tar</span></div><div class="line"><span class="comment">#AddDescription “GZIP compressed tar archive“ .tgz</span></div><div class="line">ReadmeName README</div><div class="line">HeaderName HEADER</div><div class="line">IndexIgnore .??* *~ *<span class="comment"># HEADER* README* RCS CVS *,v *,t</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当一个HTTP请求的URL为一个目录的时候，服务器返回这个目录中的索引文件。但如果一个目录中不存在缺省的索引文件，并且该服务器又许可显示目录文件列表的时候，就会显示出这个目录中的文件列表，为了使得这个文件列表能具有可理解性，而不仅仅是一个简单的列表，就需要前面的这些设置参数。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果使用了IndexOptions FancyIndexing选项，可以让服务器产生的目录列表中针对各种不同类型的文档引用各种图标。而哪种文件使用哪种图标，则使用下面的 AddIconByEncoding、AddIconByType以及AddIcon来定义，分别依据MIME的编码、类型以及文件的后缀来判断使用何种图标。如果不能确定文档使用的图标，就使用 DefaultIcon定义的缺省图标。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;同样，使用AddDescription可以为不同类型的文档加入不同的描述。并且，服务器还在目录下，查询使用ReadmeName和HeaderName定义的文件（自动加上. html后缀，如果没有发现，再使用.txt后缀进行搜索），如果发现了这些文件，就在文件列表之前首先显示这些文件的内容，以使得普通目录列表具备更大的可理解性。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IndexIgnore让服务器在列出文件列表时忽略相应的文件， 这里使用模式配置的方式定义文件名。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">AddEncoding x-compress Z</div><div class="line">AddEncoding x-gzip gz</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;AddEncoding用于告诉一些使用压缩的MIME类型，这样可以让浏览器进行解压缩操作。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">AddLanguage en .en</div><div class="line">AddLanguage fr .fr</div><div class="line">AddLanguage de .de</div><div class="line">AddLanguage da .da</div><div class="line">AddLanguage el .el</div><div class="line">AddLanguage it .it</div><div class="line">LanguagePriority en fr de</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一个HTML文档可以同时具备多个语言的版本，如对于file1.html文档可以具备file1.html.en、file1.html.fr 等不同的版本，每个语言后缀必须使用AddLanguage进行定义。这样服务器可以针对不同国家的客户，通过与浏览器进行协商，发送不同的语言版本。而LanguagePriority 定义不同语言的优先级，以便在浏览器没有特殊要求时，按照顺序使用不同的语言版本回应对file1.html 的请求。这个国际化的能力实际的应用并不多。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">AddDefaultCharset ISO-8859-1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;浏览器选择的标准编码</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;简体中文网站改为：GB2312</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#AddType application/x-httpd-php3 .phtml</span></div><div class="line"><span class="comment">#AddType application/x-httpd-php3-source .phps</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;AddType参数可以为特定后缀的文件指定MIME类型，这里的设置将覆盖mime.types中的设置。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#AddHandler cgi-script .cgi</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;AddHandler是用于指定非静态的处理类型，用于定义文档为一个非静态的文档类型，需要进行处理，再向浏览器返回处理结果。例如上面注释中的设置是将以.cgi结尾的文件设置为cgi-script类型，那么服务器将启动这个CGI程序以进行处理。如果需要在前面AliasScript定义的路径之外执行CGI程序，就需要使用这个参数进行设置，此后以.cgi结尾的文件将被当作CGI程序执行。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在配置文件、这个目录中的.htaccess以及其上级目录的.htaccess中必须允许执行CGI程序，这需要通过Options ExecCGI参数设定。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#AddType text/html .shtml</span></div><div class="line"><span class="comment">#AddHandler server-parsed .shtml</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另外一种动态进行处理的类型为server-parsed，由服务器自身预先分析网页内的标记，将标记更改为正确的HTML标识。由于server-parsed需要对text/html类型的文档进行处理，因此首先定义了对应的.shtml为text/html类型。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然而要支持SSI，还要首先要在配置文件（或.htaccess）中使用Options Includes允许该目录下的文档可以为SSI类型，或使用Options IncludesNOExec让执行普通的SSI标志，但不执行其中引用的外部程序。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另一种指定server-parsed类型的方式为使用XBitBack设置选项，如果将XBitHack设置为On，服务器将检查所有text/html类型的文档（包括.html后缀的文档），如果发现文件属性具备执行位 “x“，则服务器就认为它是服务器分析文档，需要服务器进行处理。推荐使用AddHandler进行设置，而将XBitBack 设置为Off，因为使用XBitBack将对所有的HTML文档都执行额外的检查，降低了效率。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#AddHandler send-as-is asis</span></div><div class="line"><span class="comment">#AddHandler imap-file map</span></div><div class="line"><span class="comment">#AddHandler type-map var</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上面被注释的AddHandler用于支持Apache服务器的asis、map和var处理能力。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># Action media/type /cgi-script/location</span></div><div class="line"><span class="comment"># Action handler-name /cgi-script/location</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;因为Apache内部提供的处理功能有限，因此可以使用Action为服务器定义外部程序作为可处理的动态文档类型，这些外部程序与标准CGI程序相同，都是对输入的数据处理之后，再输出不同MIME类型的结果。例如要定义一个对特殊后缀wri都先执行wri2txt进行处理操作，再返回结果的操作，可以使用：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">Action windows-writer /bin/wri2txt</div><div class="line">AddHandler windows-writer wri</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;更进一步，可以直接使用Action定义对某个MIME类型预先进行处理操作，这需要例子中第一种格式的Action 参数设置方式。这样设置方式就不再需要额外的AddHandler用来将处理操作与文件后缀联系起来，而是使用Action直接处理MIME类型的文件。但如果文档后缀没有正式的MIME类型，还需要先定义一个MIME类型。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#ErrorDocument 500 “The server made a boo boo.</span></div><div class="line"><span class="comment">#ErrorDocument 404 /missing.html</span></div><div class="line"><span class="comment">#ErrorDocument 404 /cgi-bin/missing_handler.pl</span></div><div class="line"><span class="comment">#ErrorDocument 402 http://some.other_server.com/subscription_info.html</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果客户请求的网页不存在，或者没有访问权限等情况发生时，服务器将产生一个错误代码，同时也将回应客户浏览器一个标识错误的网页。ErrorDocument就用于设置当出现哪个错误时应该回应客户浏览器那些内容，ErrorDocument的第一个参数为错误的序号，第二个参数为回应的数据，可以为简单的文本，本地网页，本地CGI程序，以及远程主机上的网页。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">BrowserMatch “Mozilla/2“ nokeepalive</div><div class="line">BrowserMatch “MSIE 4\.0b2;“ nokeepalive downgrade-1.0 force-response-1.0</div><div class="line">BrowserMatch “RealPlayer 4\.0“ force-response-1.0</div><div class="line">BrowserMatch “Java/1\.0“ force-response-1.0</div><div class="line">BrowserMatch “JDK/1\.0“ force-response-1.0</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BrowserMatch命令为特定的客户程序，设置特殊的参数，以保证对老版本浏览器的兼容性，并支持新浏览器的新特性。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment">#ProxyRequests On</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment"># Order deny,allow</span></div><div class="line"><span class="comment"># Deny from all</span></div><div class="line"><span class="comment"># Allow from .your_domain.com</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment">#ProxyVia On</span></div><div class="line"><span class="comment">#CacheRoot “/usr/local/www/proxy“</span></div><div class="line"><span class="comment">#CacheSize 5</span></div><div class="line"><span class="comment">#CacheGcInterval 4</span></div><div class="line"><span class="comment">#CacheMaxExpire 24</span></div><div class="line"><span class="comment">#CacheLastModifiedFactor 0.1</span></div><div class="line"><span class="comment">#CacheDefaultExpire 1</span></div><div class="line"><span class="comment">#NoCache a_domain.com another_domain.edu joes.garage_sale.com</span></div><div class="line"></div><div class="line"><span class="comment">#</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Apache服务器本身就具备代理的功能，然而这要求加载入mod_proxy模块。这能使用IfModule语句进行判断，如果存在mod_proxy模块，就使用ProxyRequests打开代理支持。此后的Directory用于设置对Proxy功能的访问权限设置，以及用于设置缓冲的各个参数设置。</p>
<hr>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#NameVirtualHost 12.34.56.78:80</span></div><div class="line"><span class="comment">#NameVirtualHost 12.34.56.78</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment"># ServerAdmin webmaster@host.some_domain.com</span></div><div class="line"><span class="comment"># DocumentRoot /www/docs/host.some_domain.com</span></div><div class="line"><span class="comment"># ServerName host.some_domain.com</span></div><div class="line"><span class="comment"># ErrorLog logs/host.some_domain.com-error_log</span></div><div class="line"><span class="comment"># CustomLog logs/host.some_domain.com-access_log common</span></div><div class="line"><span class="comment">#</span></div><div class="line"></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment">#</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;缺省设置文件中的这些内容是用于设置命名基础的虚拟主机服务器时使用。其中NameVirtualHost 来指定虚拟主机使用的IP地址，这个IP地址将对应多个DNS名字，如果Apache使用了Listen 参数控制了多个端口，那么就可以在这里加上端口号以进一步进行区分对不同端口的不同连接请求。此后，使用 VirtualHost语句，使用NameVirtualHost指定的IP地址作参数，对每个名字都定义对应的虚拟主机设置。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;虚拟主机是在一台Web服务器上，可以为多个单独域名提供Web服务，并且每个域名都完全独立，包括具有完全独立的文档目录结构及设置，这样域名之间完全独立，不但使用每个域名访问到的内容完全独立，并且使用另一个域名无法访问其他域名提供的网页内容。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;虚拟主机的概念对于ISP来讲非常有用，因为虽然一个组织可以将自己的网页挂在具备其他域名的服务器上的下级往址上，但使用独立的域名和根网址更为正式，易为众人接受。传统上，必须自己设立一台服务器才能达到单独域名的目的，然而这需要维护一个单独的服务器，很多小单位缺乏足够的维护能力，更为合适的方式是租用别人维护的服务器。ISP也没有必要为一个机构提供一个单独的服务器，完全可以使用虚拟主机能力，使服务器为多个域名提供Web服务，而且不同的服务互不干扰，对外就表现为多个不同的服务器。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有两种设定虚拟主机的方式，一种是基于HTTP 1.0标准，需要一个具备多IP地址的服务器，再配置DNS 服务器，给每个IP地址以不同的域名，最后才能配置Apache的配置文件，使服务器对不同域名返回不同的Web文档。由于这需要使用额外的IP地址，对每个要提供服务的域名都要使用单独的IP地址，因此这种方式实现起来问题较多。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以在一个网络界面上绑定多个IP地址，FreeBSD下需要使用ifconfig的alias参数来进行这个配置，但此时会影响网络性能。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;HTTP 1.1标准在协议中规定了对浏览器和服务器通信时，服务器能够跟踪浏览器请求的是哪个主机名字。因此可以利用这个新特性，使用更轻松的方式设定虚拟主机。这种方式不需要额外的IP地址，但需要新版本的浏览器支持。这种方式已经成为建立虚拟主机的标准方式。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要建立非IP基础的虚拟主机，多个域名是不可少的配置，因为每个域名就对应一个要服务的虚拟主机。因此需要更改DNS服务器的配置，为服务器增加多个CNAME选项，如：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">freebsd IN A 192.168.1.64</div><div class="line">vhost1 IN CNAME freebsd</div><div class="line">vhost2 IN CNAME freebsd</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;基本的设置选项都是为了freebsd主机设定的，如果要为vhost1和vhost2设定虚拟主机，就要使用VirtualHost语句定义不同的选项，在语句中可以使用配置文件前面中的大部分选项，而可以重新定义几乎所有的针对服务器的设置。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">NameVirtualHost 192.168.1.64</div><div class="line"></div><div class="line">DocumentRoot /usr/<span class="built_in">local</span>/www/data</div><div class="line">ServerName freebsd.example.org.cn</div><div class="line"></div><div class="line"></div><div class="line">DocumentRoot /vhost1</div><div class="line">ServerName vhost1.example.org.cn</div><div class="line"></div><div class="line"></div><div class="line">DocumentRoot /vhost2</div><div class="line">ServerName vhost2.example.org.cn</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里需要注意的是，VirtualHost的参数地址一定要和NameVirtualHost定义的地址相一致，必须保证所有的值严格一致，Apache服务器才承认这些定义是为这个IP地址定义的虚拟主机。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;此外，定义过NameVirtualHost之后，那么对这个IP地址的访问都被区分不同的虚拟主机进行处理，而对其他IP地址的访问，例如127.0.0.1，才应用前面定义的缺省选项。</p>
<hr>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">NameVirtualHost www.xxx.org</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;（对于动态IP的另类方法：指定虚拟主机的IP，由于要将域名映射为IP，不能使用localhost,127.0.0.1,计算机名，等这样的地址，所以，可以再一次通过域名转换，将域名转换为IP，这样就不必每次更改IP了。）</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment"># VirtualHost example:</span></div><div class="line"><span class="comment"># Almost any Apache directive may go into a VirtualHost container.</span></div><div class="line"><span class="comment"># The first VirtualHost section is used for requests without a known</span></div><div class="line"><span class="comment"># server name.</span></div><div class="line"><span class="comment">#</span></div><div class="line">&lt;VirtualHost 192.168.0.1&gt;（虚拟主机IP）</div><div class="line"> ServerAdmin 111@xxx.com（第一个虚拟主机Email）</div><div class="line"> DocumentRoot H:/web001（第一个虚拟主机目录）</div><div class="line"> ServerName www.xxx.org（第一个虚拟主机域名）</div><div class="line"> ErrorLog logs/www.xxx.org-error.log（第一个虚拟主机错误日志）</div><div class="line"> CustomLog logs/www.xxx.org-access.log common（第一个虚拟主机数据）</div><div class="line">&lt;/VirtualHost&gt;</div><div class="line"></div><div class="line">&lt;VirtualHost 192.168.0.2&gt;（虚拟主机IP）</div><div class="line"> ServerAdmin 111@xxx.com（第二个虚拟主机Email）</div><div class="line"> DocumentRoot H:/web002（第二个虚拟主机目录）</div><div class="line"> ServerName www.xxx2.org（第二个虚拟主机域名）</div><div class="line"> ErrorLog logs/www.xxx2.org-error.log（第二个虚拟主机错误日志）</div><div class="line"> CustomLog logs/www.xxx2.org-access.log common（第二个虚拟主机数据）</div><div class="line">&lt;/VirtualHost&gt;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;以此类推，可以增加更多虚拟主机。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Apache/19. Apache 用户认证/">Apache 用户认证</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Apache/">Apache</a> <a class="article__tag-link" href="/tags/LAMP/">LAMP</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有时候，需要给一些特殊的访问设置一个用户认证机制，增加安全。为了使 WEB 服务器更安全，需要将一些特定用户才能访问的目录设置用户认证，例如：网站后台登陆地址 ，可以再设置一层用户认证。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># vim /usr/local/apache2/conf/extra/httpd-vhosts.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在对应的虚拟主机配置中加入如下配置：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">&lt;Directory /data/www/admin.php&gt;</div><div class="line"> AllowOverride AuthConfig</div><div class="line"> AuthName <span class="string">"自定义的"</span></div><div class="line"> AuthType Basic</div><div class="line"> AuthUserFile /data/.htpasswd</div><div class="line"> require valid-user</div><div class="line"> &lt;/Directory&gt;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：首先指定要对哪个目录进行验证， AuthName 自定义，AuthUserFile 指定用户密码文件在哪里。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># /usr/local/apache2/bin/htpasswd -cm /data/.htpasswd yanyi</span></div><div class="line">New password: </div><div class="line">Re-type new password: </div><div class="line">Adding password <span class="keyword">for</span> user yanyi</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这一步是要创建进行验证的用户，<strong>第一次要加个 -c 选项，目的就是为了创建 /data/.htpasswd 密码文件，回车后要输入要设定的密码就 ok 了。</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后重启 apache 服务</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># /usr/local/apache2/bin/apachectl -t</span></div><div class="line">Syntax OK</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;先检查配置是否正确</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># /usr/local/apache2/bin/apachectl graceful</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里 graceful 相当于 reload 配置。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Apache/18. LAMP安装 Discuz！/">LAMP安装 Discuz！</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Apache/">Apache</a> <a class="article__tag-link" href="/tags/LAMP/">LAMP</a>
			</span>
		
	</div>

	

	
		<h2 id="1-官方网站下载discuz！"><a href="#1-官方网站下载discuz！" class="headerlink" title="1.官方网站下载discuz！"></a>1.<a href="http://www.comsenz.com/index.php" target="_blank" rel="external">官方网站</a>下载discuz！</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># mkdir /data/www</span></div><div class="line">[root@lamp ~]<span class="comment"># cd /data/www</span></div><div class="line">[root@lamp www]<span class="comment"># wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip</span></div><div class="line">[root@lamp www]<span class="comment"># unzip Discuz_X3.2_SC_GBK.zip</span></div><div class="line">[root@lamp www]<span class="comment"># mv upload/* .</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;删掉其他文件和压缩包</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp www]<span class="comment"># rm -rf readme/ utility/ upload/ Discuz_X3.2_SC_GBK.zip</span></div></pre></td></tr></table></figure>
<h2 id="2-配置第一个虚拟机"><a href="#2-配置第一个虚拟机" class="headerlink" title="2.配置第一个虚拟机"></a>2.配置第一个虚拟机</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;删除 httpd.conf 中的下面这行前面的警号 #</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#Include conf/extra/httpd-vhosts.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后编辑该配置文件</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp www]<span class="comment"># vim /usr/local/apache2/conf/extra/httpd-vhosts.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在最后面，加入如下配置：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">&lt;VirtualHost *:80&gt;</div><div class="line"> DocumentRoot <span class="string">"/data/www"</span></div><div class="line"> ServerName www.test.com</div><div class="line"> ServerAlias www.aaa.com</div><div class="line">&lt;/VirtualHost&gt;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;先检查配置是否正确</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@lamp www]<span class="comment"># /usr/local/apache2/bin/apachectl -t</span></div><div class="line">Syntax OK</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;重启 apache 服务</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp www]<span class="comment"># /usr/local/apache2/bin/apachectl restart</span></div></pre></td></tr></table></figure>
<h2 id="3-配置-mysql-，给-Discuz！-增加一个账户"><a href="#3-配置-mysql-，给-Discuz！-增加一个账户" class="headerlink" title="3.配置 mysql ，给 Discuz！ 增加一个账户"></a>3.配置 mysql ，给 Discuz！ 增加一个账户</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;给 mysql root 账户设置密码，谈后命令行进入 mysql ，创建新的库，并创建一个新的帐号对该库有所有权限：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">[root@lamp www]<span class="comment"># /usr/local/mysql/bin/mysql -uroot</span></div><div class="line">    </div><div class="line"></div><div class="line">mysql&gt; create database discuz;</div><div class="line">Query OK, 1 row affected (0.02 sec)</div><div class="line"> </div><div class="line">mysql&gt; grant all on discuz.* to <span class="string">'yanyi'</span>@<span class="string">'localhost'</span> identified by <span class="string">'123456'</span>;</div><div class="line">Query OK, 0 rows affected (0.00 sec)</div><div class="line"> </div><div class="line">mysql&gt; quit</div><div class="line">Bye</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样就创建了一个库 discuz ，然后有创建了一个用户 yanyi ，密码是 123456.</p>
<h2 id="4-安装-Discuz！"><a href="#4-安装-Discuz！" class="headerlink" title="4.安装 Discuz！"></a>4.安装 Discuz！</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;因为 www.test.com 这个域名是随便定义了一个，所以是不能直接访问的，需要先绑定 hosts ，其中hosts 在windows 和 linux 上都是存在的，可以把一个域名指向到一个 ip 上。windows 下的 hosts 文件路径是在：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;c:\windows\system32\drivers\etc\hosts 。用记事本打开，然后增加一行，保存：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;192.168.0.99   www.test.com www.aaa.com</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里的 192.168.0.99 是虚拟机的 ip 。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;浏览器输入： <a href="http://www.test.com/install/" target="_blank" rel="external">http://www.test.com/install/</a> 打开页面</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/LAMP%E5%AE%89%E8%A3%85%20Discuz%EF%BC%81/01.png?raw=true" alt=""></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/LAMP%E5%AE%89%E8%A3%85%20Discuz%EF%BC%81/02.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;根据提示，修改对应目录的权限</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># cd /data/www</span></div><div class="line">[root@lamp www]<span class="comment"># chown -R daemon:daemon data uc_server/data uc_client/data config</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;让这几个目录支持 apache 运行帐号可写， deamon 就是 apache 的运行帐号，在 /usr/local/apache2/conf/httpd.conf 中用 User 和 Group 定义的。</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/LAMP%E5%AE%89%E8%A3%85%20Discuz%EF%BC%81/03.png?raw=true" alt=""></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/LAMP%E5%AE%89%E8%A3%85%20Discuz%EF%BC%81/04.png?raw=true" alt=""></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/LAMP%E5%AE%89%E8%A3%85%20Discuz%EF%BC%81/05.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这一步，数据库名，就是第三步创建的新数据库。数据库用户名和密码也是第三步创建的用户和密码。管理员密码一定要记得。点下一步后，就会看到安装数据库的过程，然后到 “discuz 应用中心”的页面，直接点右下角“点此访问”，就安装成功discuz 论坛了。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Apache/17. 如何使用apache的 work模式还是 prefork 模式/">如何使用apache的 work模式还是 prefork 模式</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Apache/">Apache</a> <a class="article__tag-link" href="/tags/LAMP/">LAMP</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意：2.4之前版本默认为prefork， 2.4已经变为event模式。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在编译apache的时候，有一个参数叫做  <code>--with-mpm=...</code> 等号后边用于指定那种模式，可选的有 beos|event|worker|prefork|mpmt_os2 其中，咱们都知道 prefork 以及 worker 其他模式就不晓得了，感兴趣不妨你去google一下。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当你编译时，不指定哪种模式，就是说，不加该参数，那么默认apache会以prefork模式来为我们提供服务。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">/configure --prefix=/usr/<span class="built_in">local</span>/apache2</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;验证的话，就是用  <code>apachectl -l</code>  看看是否有 <code>prefork.c</code></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果想要worker模式，那么请指定 </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">./configure --prefix=/usr/<span class="built_in">local</span>/apache2 --with-mpm=worker</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<code>apachectl -l</code> 查看，有<br><code>worker.c</code> 而没有 <code>prefork.c</code></p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Apache/16. mod_usertrack.so 的扩展安装以及使用/">mod_usertrack.so 的扩展安装以及使用</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Apache/">Apache</a> <a class="article__tag-link" href="/tags/LAMP/">LAMP</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;mod_usertrack.so 是在用户首次来到当前网站的时候给用户种下一个唯一的cookie，这个cookie是用户首次来当前网站的IP地址加上一个随机字符串组成的。用这个IP加随机字符串来标识用户的唯一性。这样就可以区分同一个IP下的不同用户了。</p>
<h2 id="1-mod-usertrack-so-的安装。"><a href="#1-mod-usertrack-so-的安装。" class="headerlink" title="1. mod_usertrack.so 的安装。"></a>1. mod_usertrack.so 的安装。</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;到apache的源码包下，找到 mod_usertrack.c ，默认会在 modules/metadata/ 下，如果找不到find一下。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">/usr/<span class="built_in">local</span>/apache/bin/apxs -i -a -c mod_usertrack.c</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样就安装好了，安装好后，会自动在 httpd.conf 中增加一行：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">LoadModule usertrack_module   modules/mod_usertrack.so</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当然了，mod_usertrack.so 同样会安装到  modules/ 下</p>
<h2 id="2-配置httpd-conf-使用-mod-usertrack-so"><a href="#2-配置httpd-conf-使用-mod-usertrack-so" class="headerlink" title="2. 配置httpd.conf 使用 mod_usertrack.so"></a>2. 配置httpd.conf 使用 mod_usertrack.so</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在httpd.conf 中加入：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">CookieTracking on     <span class="comment"># 打开cookietracking 功能</span></div><div class="line">CookieExpires <span class="string">"1 years"</span>  <span class="comment"># 设置cookie失效日期</span></div><div class="line">CookieStyle Cookie      <span class="comment"># 设置cookie的样式</span></div><div class="line">CookieName   12345    <span class="comment"># 自定义，可以不加该选项</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后修改日志格式</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">LogFormat <span class="string">"%h %l %u %t \"%r\" %&gt;s %b \"%&#123;Referer&#125;i\" \"%&#123;User-Agent&#125;i\" %&#123;cookie&#125;n"</span> combined</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其实，就是在默认的日志格式中加入  %{cookie}n </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果，你只想针对某个虚拟主机生效，请把</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">CookieTracking on</div><div class="line">CookieExpires <span class="string">"1 years"</span></div><div class="line">CookieStyle Cookie</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;以上三行加入到相关的虚拟主机配置段中。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;参考：<a href="http://www.chedong.com/blog/archives/001077.html" target="_blank" rel="external">http://www.chedong.com/blog/archives/001077.html</a></p>

	

	

</article>





	<span class="different-posts">📖 <a href="/page/47">more posts</a> 📖</span>



	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
